/*
 * CommunicationPrimerCinta.cpp
 *
 *  Created on: 18/11/2013
 *      Author: gonzalo
 */

#include "CommunicationPrimerCinta.h"


namespace middleware {

const std::string CommunicationPrimerCinta::CINTA_SHMEM_PATH = "/tmp/PrimerCintashMem";
const char CommunicationPrimerCinta::CINTA_SHMEM_KEY_IZQ = 'i';
const char CommunicationPrimerCinta::CINTA_SHMEM_KEY_DER = 'd';

CommunicationPrimerCinta::CommunicationPrimerCinta(char key):
		 shMemCinta(ipc::SharedMemoryInterface<CintaProductos>::get(CINTA_SHMEM_PATH, key, DSM_ENABLED ? ((key == CINTA_SHMEM_KEY_IZQ)? DSMID_PRIMERCINTA_IZQ : DSMID_PRIMERCINTA_DER) : 0))
{
	this->key=key;
}

Producto CommunicationPrimerCinta::obtenerProducto() {

	CintaProductos cinta=shMemCinta.read();

	return cinta.productos[4];
}

void CommunicationPrimerCinta::moverCinta(){

	CintaProductos cinta=shMemCinta.read();
	cinta.productos[4]=cinta.productos[3];
	cinta.vacios[4]=cinta.vacios[3];

	cinta.productos[3]=cinta.productos[2];
	cinta.vacios[3]=cinta.vacios[2];

	cinta.productos[2]=cinta.productos[1];
	cinta.vacios[2]=cinta.vacios[1];

	cinta.productos[1]=cinta.productos[0];
	cinta.vacios[1]=cinta.vacios[0];

	cinta.vacios[0]=true;
	cinta.productos[0].productoId = 0;
	shMemCinta.write(cinta);

	this->mostrarCinta();

}

void CommunicationPrimerCinta::mostrarCinta() {
	CintaProductos cinta=shMemCinta.read();
	std::cout << std::endl << "Cinta: [ ";
	for(int i=0;i<5;i++){
		 std::cout << cinta.productos[i].productoId << " ";
	}
	std::cout << "]"<<  std::endl;
}

void CommunicationPrimerCinta::lockCinta(){
	shMemCinta.lock();
}

void CommunicationPrimerCinta::unlockCinta(){
	shMemCinta.unlock();
}


bool CommunicationPrimerCinta::primerEspacioVacio(){
	CintaProductos cinta=shMemCinta.read();
	return cinta.vacios[0];
}

bool CommunicationPrimerCinta::ultimoEspacioVacio(){
	CintaProductos cinta=shMemCinta.read();
	return cinta.vacios[4];
}

bool CommunicationPrimerCinta::cintaVacia(){
	CintaProductos cinta = shMemCinta.read();
	for (int i=0; i<5; i++) {
		if (cinta.vacios[i] == false) {
			return false;
		}
	}
	return true;
}

void CommunicationPrimerCinta::ponerProducto(Producto prod){
	CintaProductos cinta=shMemCinta.read();
	cinta.productos[0]=prod;
	cinta.vacios[0]=false;
	shMemCinta.write(cinta);
}

void middleware::CommunicationPrimerCinta::create(char key) {
	ipc::SharedMemoryInterface<CintaProductos> shMem = ipc::SharedMemoryInterface<CintaProductos>::createNonExclusive(CINTA_SHMEM_PATH, key);
	if (!DSM_ENABLED) {
		CommunicationPrimerCinta::inicializar(shMem);
	}
}

void middleware::CommunicationPrimerCinta::destroy(char key) {
	ipc::SharedMemoryInterface<CintaProductos>::destroy(CINTA_SHMEM_PATH, key);
}

int middleware::CommunicationPrimerCinta::cantidadProductosEnCinta(){

	CintaProductos cinta=shMemCinta.read();
	int cont=0;
	for(int i=0;i<5;i++){
		if (!cinta.vacios[i]) cont++;
	}

	return cont;
}

char CommunicationPrimerCinta::getKey() {
	return this->key;
}

void middleware::CommunicationPrimerCinta::inicializar(ipc::SharedMemoryInterface<CintaProductos> shMem) {
	shMem.lock();
	CintaProductos cinta=shMem.read();
	for(int i=0;i<5;i++){
		cinta.vacios[i] = true;
		cinta.productos[i].productoId = 0;
	}
	shMem.write(cinta);
	shMem.unlock();
}

CommunicationPrimerCinta::~CommunicationPrimerCinta() {
}

}

/* namespace middleware */
